#ifndef TERRAIN_H
#define TERRAIN_H
#include "Sprite.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <string.h>
#define CACHE_SIZE 5000
#define LARGEUR_FENETRE 1800
#define HAUTEUR_FENETRE 415


typedef struct Ssprite Sprite;

/**
@struct tabTerrain Terrain.h "~/lif7-projet-jetpack/src/Terrain.h" Structure définissant le tableau de terrain. \n
*/



struct sTerrain
{
    int nbtiles_largeur_monde,nbtiles_hauteur_monde;
    int xscroll;
    char **schema;
    int *tileplein;
    int nbtilesX,nbtilesY;
    int largeur_fenetre, hauteur_fenetre;
    int LARGEUR_TILE,HAUTEUR_TILE;
    int focusx, focusy, focusw, focush;
    Sprite* focusSprite;
};
typedef struct sTerrain Terrain;

/**
@brief <B> Brief Description </B> initialise le terrain. \n
@details <B> Description </B> terInit initialise le terrain(après vérification) et alloue un espace mémoire. \n
@param[in,out] Terrain Pointeur sur pTab. \n
*/
void terInit(Terrain * pTer, Terrain * pTersuiv);




/**
@brief <B> Brief Description </B> Test les coordonnées du terrain . \n
@details <B> Description </B> terGetXY test les coordonnées et retourne un caractère . \n
@param[in,out] Terrain Pointeur sur pTer. \n
*/
const char terGetXY(const Terrain * pTer, int x, int y);

/**
@brief <B> Brief Description </B> Test les coordonnées du terrain . \
@details <B> Description </B> terSetXY test les coordonnées et ajoute le caractère val . \n
@param[in,out] Terrain Pointeur sur pTer. \n
@param[in] entiers Les coordonnées x et y. \n
@param[in] caractère Caractère val. \n
*/
void terSetXY(Terrain * pTer, int x, int y, char valeur);

/**
@brief <B> Brief Description </B> Retourne la valeur dimx . \n
@details <B> Description </B> getDimX Retourne la valeur dimx. \n
@param[in,out] Terrain Pointeur sur pTer. \n
@return Retourne un entier dimx. \n
*/
const int getDimX(const Terrain * pTer);

/**
@brief <B> Brief Description </B> Retourne la valeur dimy . \n
@details <B> Description </B> getDimY Retourne la valeur dimy. \n
@param[in,out] Terrain Pointeur sur pTer. \n
@return Retourne un entier dimy. \n
*/
const int getDimY(const Terrain * pTer);

/**
@brief <B> Brief Description </B> Selectionne un pointeur de tabTerrain. \n
@details <B> Description </B> selectTerrain selectionne un pointeur de tabTerrain pour former les niveaux. \n
@param[in,out] tabTerrain Pointeur sur pTab. \n
*/
const char * selectTerrain(char * chemin);

/**
@brief <B> Brief Description </B> Verifie la prochaine case. \n
@details <B> Description </B> Vérifie si la prochaine case est valide et renvoie un booléen. \n
@param[in,out] Terrain pointeur sur terrain et x et y les coordonnées. \n
*/
int verifProchCase(const Terrain *pTer, float x, float y);

/**
@brief <B> Brief Description </B> Charge une carte. \n
@details <B> Description </B> Charge une carte depuis un fichier texte. \n
@param[in,out] FILE Pointeur sur fichier F. \n
@param[in,out] terrain Pointeur sur pTer. \n
*/
void chargerNiveau(FILE* F,Terrain * pTer);


/**
@brief <B> Brief Description </B> Charge Les tileset. \n
@details <B> Description </B> Charge les tilesets depuis le fichier image. \n
@param[in,out] FILE Pointeur sur fichier F. \n
@param[in,out] terrain Pointeur sur pTer. \n
*/
void chargerTileset(FILE* F,Terrain * pTer);

/**
@brief <B> Brief Description </B>Focalise la fenêtre sur le personnage. \n </B>
@param[in,out] Map Pointeur sur m. \n
@param[in,out] Sprite Pointeur sur sp. \n
@param[in] Entier Coordonnée x. \n
@param[in] Entier Coordonnée y. \n
@param[in] Entier Coordonnée w. \n
@param[in] Entier Coordonnée h. \n
@return Retourne un Sprite. \n
*/
Sprite* FocusScrollBox(Terrain* pTer,Sprite* pSprite, int x, int y, int w, int h);

void chargerTerrain(Terrain * pTer, const char* level,int largeur_fenetre,int hauteur_fenetre);

/**
@brief <B> Brief Description </B> Charge la carte. \n </B>
@details <B> Description </B> Permet de charger la prochaine carte et de la garder en mémoire jusqu'à son affichage. \n
@param[in,out] Map Pointeur sur m. \n
@param[in,out] Map Pointeur sur suiv. \n
*/
void CopieProchCarte(Terrain* m, Terrain* suiv);

/**
@brief <B> Brief Description </B> Libère la mémoire allouée . \n
@details <B> Description </B> Libère la mémoire du tableau de terrains . \n
@param[in,out] Terrain Pointeur sur pTer. \n
@return Retourne un entier. \n
*/
int libereTerrain(Terrain* pTer);

#endif
